#ifndef PAGENUMBER_V2_SIMPLIFIED_H
#define PAGENUMBER_V2_SIMPLIFIED_H

#include <QString>
#include <optional>
#include <QDebug>

/**
 * @file pagenumber_v2_simplified.h
 * @brief 极简类型安全页码系统 - 去除伪需求后的终极版本
 * 
 * 核心理念：
 * 1. 只有两种页码：ArrayIndex（0-based）和 PageNumber（1-based全局页码）
 * 2. 没有本地页码（LocalPageNumber）- 用户永远看到的是全局连续页码
 * 3. 类型系统防止0-based/1-based混淆
 * 4. constexpr支持，零运行时开销
 * 
 * @author LimeReader Team  
 * @date 2025-11-04
 */

namespace PageNumberV2 {

// ============================================================================
// 核心类型1：ArrayIndex（数组索引，0-based）
// ============================================================================

/**
 * @brief 数组索引类型（0-based）
 * 
 * 唯一用途：访问QList、QVector等容器
 * 不变式：m_value >= 0
 */
class ArrayIndex {
private:
    int m_value;
    
public:
    explicit constexpr ArrayIndex(int value = 0) 
        : m_value(value < 0 ? 0 : value) {}
    
    constexpr int value() const { return m_value; }
    constexpr bool isValid() const { return m_value >= 0; }
    
    // 运算符
    constexpr ArrayIndex next() const { return ArrayIndex(m_value + 1); }
    constexpr ArrayIndex previous() const { return ArrayIndex(m_value > 0 ? m_value - 1 : 0); }
    
    // 比较
    friend constexpr bool operator==(ArrayIndex a, ArrayIndex b) { return a.m_value == b.m_value; }
    friend constexpr bool operator<(ArrayIndex a, ArrayIndex b) { return a.m_value < b.m_value; }
    
    // 调试输出
    friend QDebug operator<<(QDebug d, ArrayIndex idx) {
        return d << "ArrayIndex(" << idx.m_value << ")";
    }
};

// ============================================================================
// 核心类型2：PageNumber（全局页码，1-based）
// ============================================================================

/**
 * @brief 全局页码类型（1-based）
 * 
 * 唯一用途：显示给用户的页码（跨文件连续）
 * 不变式：m_value >= 1
 * 
 * 注意：没有"本地页码"概念！用户看到的永远是全局连续的页码。
 */
class PageNumber {
private:
    int m_value;
    
public:
    explicit constexpr PageNumber(int value = 1) 
        : m_value(value < 1 ? 1 : value) {}
    
    constexpr int value() const { return m_value; }
    constexpr bool isValid() const { return m_value >= 1; }
    
    // 类型转换（显式）
    constexpr ArrayIndex toArrayIndex() const { 
        return ArrayIndex(m_value - 1); 
    }
    
    static constexpr PageNumber fromArrayIndex(ArrayIndex idx) {
        return PageNumber(idx.value() + 1);
    }
    
    // 运算符
    constexpr PageNumber next() const { return PageNumber(m_value + 1); }
    constexpr PageNumber previous() const { return PageNumber(m_value > 1 ? m_value - 1 : 1); }
    
    // 格式化
    QString toString() const { return QString::number(m_value); }
    
    // 比较
    friend constexpr bool operator==(PageNumber a, PageNumber b) { return a.m_value == b.m_value; }
    friend constexpr bool operator<(PageNumber a, PageNumber b) { return a.m_value < b.m_value; }
    
    // 调试输出
    friend QDebug operator<<(QDebug d, PageNumber p) {
        return d << "PageNumber(" << p.m_value << ")";
    }
};

// ============================================================================
// 业务类型：GlobalPageContext（全局页码上下文）
// ============================================================================

/**
 * @brief 全局页码上下文 - 封装页码相关的所有信息
 * 
 * 包含：当前页码 + 总页数
 * 用途：渲染、验证、导航
 */
class GlobalPageContext {
private:
    PageNumber m_currentPage;
    int m_totalPages;
    
public:
    GlobalPageContext(PageNumber current, int total)
        : m_currentPage(current), m_totalPages(total) {}
    
    // 访问器
    PageNumber currentPage() const { return m_currentPage; }
    int totalPages() const { return m_totalPages; }
    int currentPageValue() const { return m_currentPage.value(); }
    
    // 业务逻辑
    bool isValid() const { 
        return m_currentPage.value() >= 1 && m_currentPage.value() <= m_totalPages; 
    }
    bool isFirstPage() const { return m_currentPage.value() == 1; }
    bool isLastPage() const { return m_currentPage.value() == m_totalPages; }
    bool hasNextPage() const { return m_currentPage.value() < m_totalPages; }
    bool hasPreviousPage() const { return m_currentPage.value() > 1; }
    
    // 导航（返回新上下文）
    GlobalPageContext next() const { 
        return GlobalPageContext(m_currentPage.next(), m_totalPages); 
    }
    GlobalPageContext previous() const { 
        return GlobalPageContext(m_currentPage.previous(), m_totalPages); 
    }
    
    // 格式化（支持占位符）
    QString format(const QString& template_) const {
        return QString(template_)
            .replace("{page}", m_currentPage.toString())      // 全局页码
            .replace("{total}", QString::number(m_totalPages)) // 总页数
            .replace("{global}", m_currentPage.toString())     // 别名，同{page}
            .replace("{local}", m_currentPage.toString());     // 兼容旧格式，但实际就是全局页码
    }
    
    // 调试输出
    friend QDebug operator<<(QDebug d, const GlobalPageContext& ctx) {
        return d << "GlobalPageContext(page=" << ctx.m_currentPage.value() 
                 << ", total=" << ctx.m_totalPages << ")";
    }
};

// ============================================================================
// 工具函数：核心转换逻辑
// ============================================================================

/**
 * @brief 将文件内索引转换为全局页码上下文
 * 
 * @param fileArrayIndex 文件内数组索引（0-based）
 * @param fileStartPage 文件的全局起始页码（1-based）
 * @param totalPages 全局总页数
 * @return 全局页码上下文
 * 
 * 示例：
 * @code
 *   // 文件3，起始页50，当前显示该文件的第2个元素（索引1）
 *   ArrayIndex idx(1);
 *   PageNumber startPage(50);
 *   GlobalPageContext ctx = makeGlobalContext(idx, startPage, 100);
 *   // ctx.currentPageValue() == 51
 * @endcode
 */
inline GlobalPageContext makeGlobalContext(
    ArrayIndex fileArrayIndex,
    PageNumber fileStartPage, 
    int totalPages
) {
    int globalValue = fileStartPage.value() + fileArrayIndex.value();
    return GlobalPageContext(PageNumber(globalValue), totalPages);
}

/**
 * @brief 从全局页码计算文件内数组索引
 * 
 * @param globalPage 全局页码
 * @param fileStartPage 文件起始页码
 * @return 文件内数组索引（如果页码不在文件范围内，返回nullopt）
 */
inline std::optional<ArrayIndex> extractFileIndex(
    PageNumber globalPage,
    PageNumber fileStartPage
) {
    int offset = globalPage.value() - fileStartPage.value();
    if (offset < 0) {
        return std::nullopt;
    }
    return ArrayIndex(offset);
}

} // namespace PageNumberV2

// ============================================================================
// 简化后的使用示例
// ============================================================================

/*

// ====== 示例1：获取当前全局页码（PageView） ======

GlobalPageContext PageView::getCurrentContext() const {
    using namespace PageNumberV2;
    
    // 1. 获取必要信息
    ArrayIndex currentIdx(m_currentPage);  // 0-based数组索引
    PageNumber startPage(m_globalStartPage);  // 文件起始页
    int totalPages = GlobalPageManager::instance().getTotalGlobalPages();
    
    // 2. 一行代码生成上下文
    return makeGlobalContext(currentIdx, startPage, totalPages);
}

// ====== 示例2：渲染页码（UnifiedPageRenderer） ======

void UnifiedPageRenderer::renderPageNumber(const GlobalPageContext& ctx) {
    if (!m_settings->pageNumber.enabled) return;
    
    // 一行代码格式化页码（无需手动计算localPage！）
    QString text = ctx.format(m_settings->pageNumber.format);
    
    // 渲染...
    painter.drawText(position, text);
}

// ====== 示例3：页面导航 ======

void PageView::nextPage() {
    GlobalPageContext current = getCurrentContext();
    
    if (current.hasNextPage()) {
        GlobalPageContext next = current.next();
        jumpToGlobalPage(next.currentPage());
    }
}

// ====== 示例4：GlobalPageManager简化 ======

class GlobalPageManager {
public:
    // 唯一的转换方法（类型安全）
    std::optional<GlobalPageContext> getContext(
        const QString& fileId, 
        ArrayIndex fileIndex
    ) const {
        // 查找文件起始页
        auto it = m_fileStartPages.find(fileId);
        if (it == m_fileStartPages.end()) {
            return std::nullopt;
        }
        
        PageNumber startPage = it->second;
        return makeGlobalContext(fileIndex, startPage, m_totalPages);
    }
    
private:
    QMap<QString, PageNumber> m_fileStartPages;  // 强类型！
    int m_totalPages;
};

// ====== 对比：去除本地页码前后 ======

// 旧代码（复杂）：
int localPage = pageIndex + 1;
int globalPage = convertToGlobalPage(fileId, pageIndex);
QString text = formatPageNumber(localPage, globalPage, totalPages);  // 3个参数！

// 新代码（简洁）：
GlobalPageContext ctx = makeGlobalContext(ArrayIndex(pageIndex), startPage, totalPages);
QString text = ctx.format("{page}");  // 一行搞定！

*/

#endif // PAGENUMBER_V2_SIMPLIFIED_H


